var async=require('async');
var mock=require('./mock.js');

/*中途发生错误时，如果调用了错误句柄，
之后的task仍会继续执行，
最终结果为task执行的顺序
	1.错误发生时已经成功返回的task，则将其结果保存在对应的位置
	2.错误发生时已经执行但还未返回的task，则将空值保存在对应的位置
	3.错误发生时还未开始执行的task则忽略其结果
	4.错误的task的固定返回值undefind以及错误发生时还未返回的task的固定返回值 空
	5.结果数组的总长度为错误发生时已经开始执行task数
*/


async.waterfall([
	(cb)=>{
		setTimeout(()=>{
			cb(null,[1,2,3,4,5]);
		},Math.random()*1000|0);
	},
	(ids,cb)=>{
		async.map(ids,(id,mcb)=>{		
			async.waterfall([
				(pcb)=>{
					mock.getPost(id==2,id,(err,post)=>{
						console.log('\npost:',id,err,post);
						if(err || !post)return mcb();
						pcb(null,post);
					});
				},
				(post,pcb)=>{
					mock.getUser(0,id,(err,user)=>{
						console.log('\nuser:',id,err,user);						
						if(err || !user)return mcb();
						pcb(null,user,post);
					});
				}
			],(err,user,post)=>{
				console.log('\nuser+post:',err,user,post);
				if(err || !post)return cb();
				post.user=user;
				mcb(null,post);
			});

		},(err,posts)=>{
			console.log('\nposts:',err,posts);
			cb(null,posts);
		});
	}
],(err,posts)=>{
	console.log('\nret:',err,posts);
});